<item name="Change ID" key="change id" id="{58D94AA4-DDDB-48C1-B631-79898497E5F5}" tid="{DD22F1B3-BD87-4DB2-9E7D-F7A496888D43}" mid="{00000000-0000-0000-0000-000000000000}" sortorder="300" language="da" version="1" template="powershell script" parentid="{F074E83C-C1C0-4648-A49F-8D071B26A831}" created="20130502T154300Z"><fields><field tfid="{5DD74568-4D4B-44C1-B513-0AF5F4CDA34F}" key="__created by" type="Single-Line Text"><content>sitecore\Admin</content></field><field tfid="{8CDC337E-A112-42FB-BBB4-4143751E123F}" key="__revision" type="Single-Line Text"><content>98d0bd73-8ad5-4631-af49-b53dd8c01e38</content></field><field tfid="{25BED78C-4957-4165-998A-CA1B52F67497}" key="__created" type="Datetime"><content>20190718T152341Z</content></field><field tfid="{9541E67D-CE8C-4225-803D-33F7F29F09EF}" key="__short description" type="Single-Line Text"><content>Kopier alle rederingerne fra det valgte element.</content></field><field tfid="{B5E02AD9-D56F-4C41-A065-A133DB87BDEB}" key="__display name" type="Single-Line Text"><content>Kopier rederinger</content></field><field tfid="{1C76313E-3C8C-4807-A826-135D10C39299}" key="showrule" type="Rules"><content>&lt;ruleset /&gt;</content></field><field tfid="{06D5295C-ED2F-4A54-9BF2-26228D113318}" key="__icon" type="Icon"><content>Office/32x32/copy.png</content></field><field tfid="{7FA141B7-7473-44A9-9BD9-2739C51FF8DA}" key="persistentsessionid" type="Single-Line Text"><content /></field><field tfid="{DBBBECA1-21C7-4906-9DD2-493C1EFA59A2}" key="__shared revision" type="Single-Line Text"><content>60b5b0c1-97e4-4895-badd-25193919c027</content></field><field tfid="{B1A94FF0-6897-47C0-9C51-AA6ACB80B1F0}" key="script" type="Multi-Line Text"><content>$ContextItem = Get-Item -Path .
[string]$OldTemplateId = $ContextItem.ID.ToString()

$NewTemplateId = Show-Input -Prompt "Enter the ID:"
[guid]$guidEntered = [guid]::Empty
if (![guid]::TryParse($NewTemplateId, [ref]$guidEntered)) {
    Show-Alert "The entered ID is not a valid GUID. Please enter a valid GUID."
    return
}


    [bool]$RebuildLinkDb = $false
    [bool]$DoPublish = $false


function Write-Log { param([string]$msg) ; Write-Host "[TEMPLATE MIGRATION] $msg" }
function Ensure-SingleItem($itemOrArray) {
    if ($null -eq $itemOrArray) { return $null }
    if ($itemOrArray -is [Sitecore.Data.Items.Item]) { return $itemOrArray }
    if ($itemOrArray -is [System.Collections.IEnumerable]) {
        $found = $itemOrArray | Where-Object { $_ -is [Sitecore.Data.Items.Item] }
        if ($found) { return $found | Select-Object -First 1 }
        else { return $null }
    }
    return $null
}

$OldTemplateId = $OldTemplateId.Trim()
$NewTemplateId = $NewTemplateId.Trim()
if (-not ($OldTemplateId -match "^\{[0-9A-Fa-f-]{36}\}$") -or -not ($NewTemplateId -match "^\{[0-9A-Fa-f-]{36}\}$")) {
    throw "Both IDs must be in GUID format: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"
}

$masterDb = Get-Database -Name "master"
$oldTemplate = $masterDb.GetItem([Sitecore.Data.ID]::Parse($OldTemplateId))
if (-not $oldTemplate) { throw "Old template ID not found: $OldTemplateId" }
$newTemplateExists = $masterDb.GetItem([Sitecore.Data.ID]::Parse($NewTemplateId))
if ($newTemplateExists) { throw "New template ID already exists: $NewTemplateId" }
$parentItem = $oldTemplate.Parent
$origName = $oldTemplate.Name
$tempName = $origName + "-Temp-" + ([guid]::NewGuid().ToString("N").Substring(0, 8))

Write-Log "Cloning template '$($oldTemplate.Paths.FullPath)' to new ID: $NewTemplateId with temp name $tempName..."

function Clone-TemplateWithNewId {
    param(
        [Sitecore.Data.Items.Item]$sourceItem,
        [Sitecore.Data.Items.Item]$parentItem,
        [string]$replaceOldId,
        [string]$replaceNewId,
        [string]$cloneName
    )
    $db = $sourceItem.Database
    if (-not $parentItem) { throw "Parent item is null for $($sourceItem.Name)" }
    $newItemId = if ($sourceItem.ID.ToString().ToUpper() -eq $replaceOldId.ToUpper()) {
        $replaceNewId
    } else {
        ([guid]::NewGuid()).ToString("B").ToUpper()
    }
    $templateId = $sourceItem.TemplateID
    $newItem = $parentItem.Add($cloneName, [Sitecore.Data.TemplateID]$templateId, [Sitecore.Data.ID]::Parse($newItemId))
    if (-not $newItem) { throw "Failed to add item $cloneName under $($parentItem.Paths.FullPath)" }
    foreach ($srcField in $sourceItem.Fields) {
        if (($srcField.Shared -or $srcField.Unversioned) -and (-not $srcField.ReadOnly)) {
            $dstField = $newItem.Fields[$srcField.ID]
            if ($dstField) {
                try {
                    $newItem.Editing.BeginEdit()
                    $dstField.SetValue($srcField.GetValue($false), $false)
                    $newItem.Editing.EndEdit()
                } catch { if ($newItem.Editing -ne $null) { $newItem.Editing.CancelEdit() } }
            }
        }
    }
    foreach ($lang in $sourceItem.Languages) {
        $versionNumbers = $sourceItem.Versions.GetVersionNumbers($lang)
        foreach ($ver in $versionNumbers) {
            $verSrc = $db.GetItem($sourceItem.ID, $lang, $ver.Number)
            $verDst = $db.GetItem($newItem.ID, $lang, $ver.Number)
            if ($verDst -and $verSrc) {
                foreach ($srcField in $verSrc.Fields) {
                    if (-not $srcField.Shared -and -not $srcField.Unversioned -and -not $srcField.ReadOnly) {
                        $dstField = $verDst.Fields[$srcField.ID]
                        if ($dstField) {
                            try {
                                $verDst.Editing.BeginEdit()
                                $dstField.SetValue($srcField.GetValue($false), $false)
                                $verDst.Editing.EndEdit()
                            } catch { if ($verDst.Editing -ne $null) { $verDst.Editing.CancelEdit() } }
                        }
                    }
                }
            }
        }
    }
    foreach ($child in $sourceItem.Children) {
        if ($child.Name -ne "__Standard Values") {
            $newChildItem = Clone-TemplateWithNewId -sourceItem $child -parentItem $newItem -replaceOldId $replaceOldId -replaceNewId $replaceNewId -cloneName $child.Name
        }
    }
    return $newItem
}

$newTemplate = Clone-TemplateWithNewId -sourceItem $oldTemplate -parentItem $parentItem -replaceOldId $OldTemplateId -replaceNewId $NewTemplateId -cloneName $tempName
$newTemplate = Ensure-SingleItem $newTemplate
if (-not ($newTemplate -is [Sitecore.Data.Items.Item])) { throw "newTemplate is not a Sitecore item!" }

$newStdValues = $newTemplate.Children | Where-Object { $_.Name -eq "__Standard Values" } | Select-Object -First 1
$newStdValues = Ensure-SingleItem $newStdValues
if ($newStdValues -and $newStdValues -is [Sitecore.Data.Items.Item]) {
    Remove-Item -Path $newStdValues.Paths.FullPath -Recurse -Force
    Write-Log "Deleted auto-created __Standard Values from new template."
}

$oldStdValues = $oldTemplate.Children | Where-Object { $_.Name -eq "__Standard Values" } | Select-Object -First 1
$oldStdValues = Ensure-SingleItem $oldStdValues
$newTemplate = Ensure-SingleItem $newTemplate
if ($oldStdValues -and $oldStdValues -is [Sitecore.Data.Items.Item] -and $newTemplate -is [Sitecore.Data.Items.Item]) {
    try {
        $oldStdValues.MoveTo($newTemplate)
        Write-Log "Moved old __Standard Values to new template."
        foreach ($lang in $oldStdValues.Languages) {
            $versions = $oldStdValues.Versions.GetVersionNumbers($lang)
            foreach ($ver in $versions) {
                $verItem = $oldStdValues.Database.GetItem($oldStdValues.ID, $lang, $ver.Number)
                if ($verItem) {
                    try {
                        $verItem.Editing.BeginEdit()
                        $verItem.TemplateID = [Sitecore.Data.ID]::Parse($NewTemplateId)
                        $verItem.Editing.EndEdit()
                    } catch {
                        if ($verItem.Editing -ne $null) { $verItem.Editing.CancelEdit() }
                        Write-Log "Failed to set TemplateID for Standard Values $($verItem.Paths.FullPath)"
                    }
                }
            }
        }
        Write-Log "Updated TemplateID for __Standard Values to new template."
    } catch {
        Write-Log "Failed to move old __Standard Values."
        throw $_
    }
} else {
    Write-Log "Could not move __Standard Values: newTemplate or oldStdValues not valid Sitecore Items."
}

Write-Log "Moving all template children (except __Standard Values) to new template..."
foreach ($child in $oldTemplate.Children) {
    if ($child.Name -ne "__Standard Values") {
        $child = Ensure-SingleItem $child
        if ($child -is [Sitecore.Data.Items.Item] -and $newTemplate -is [Sitecore.Data.Items.Item]) {
            try {
                $child.MoveTo($newTemplate)
                Write-Log "Moved: $($child.Name)"
            } catch { Write-Log "Failed to move: $($child.Name)" }
        }
    }
}

Write-Log "Patching all descendants (section, field, etc.) under the new template..."
foreach ($desc in $newTemplate.Axes.GetDescendants()) {
    $needsUpdate = $false
    try {
        $desc.Editing.BeginEdit()
        if ($desc.TemplateID -eq $OldTemplateId) {
            $desc.TemplateID = [Sitecore.Data.ID]::Parse($NewTemplateId)
            $needsUpdate = $true
        }
        $sourceField = $desc.Fields["Source"]
        if ($sourceField -and $sourceField.Value -and $sourceField.Value -like "*$OldTemplateId*") {
            $sourceField.Value = $sourceField.Value.Replace($OldTemplateId, $NewTemplateId)
            $needsUpdate = $true
        }
        $baseTemplatesField = $desc.Fields["__Base templates"]
        if ($baseTemplatesField -and $baseTemplatesField.Value -like "*$OldTemplateId*") {
            $baseTemplatesField.Value = $baseTemplatesField.Value.Replace($OldTemplateId, $NewTemplateId)
            $needsUpdate = $true
        }
        if ($needsUpdate) {
            $desc.Editing.EndEdit()
            Write-Log "Patched descendant: $($desc.Paths.FullPath)"
        } else {
            $desc.Editing.CancelEdit()
        }
    } catch {
        if ($desc.Editing -ne $null) { $desc.Editing.CancelEdit() }
        Write-Log "Failed to patch descendant: $($desc.Paths.FullPath)"
    }
}

# THE FIX: Use fast:/ query to update all items derived from the old template
Write-Log "Updating all items that use the old template using fast query..."
$query = "fast:/sitecore/content//*[@@templateid='" + $OldTemplateId + "']"
$allContentItems = $masterDb.SelectItems($query)
foreach ($item in $allContentItems) {
    try {
        $item.Editing.BeginEdit()
        $item.TemplateID = [Sitecore.Data.ID]::Parse($NewTemplateId)
        $stdValuesField = $item.Fields["__Standard Values"]
        if ($stdValuesField) { $stdValuesField.Value = "" }
        $iconField = $item.Fields["__Icon"]
        $stdIconField = $oldStdValues.Fields["__Icon"]
        if ($iconField -and $stdIconField -and $stdIconField.Value) {
            $iconField.Value = $stdIconField.Value
        }
        $item.Editing.EndEdit()
        Write-Log "Updated content: $($item.Paths.FullPath)"
    } catch {
        if ($item.Editing -ne $null) { $item.Editing.CancelEdit() }
        Write-Log "Failed to update content: $($item.Paths.FullPath)"
    }
}

# Flush all Sitecore caches to avoid ghost items
Write-Log "Clearing all Sitecore caches..."
[Sitecore.Caching.CacheManager]::ClearAllCaches()

Write-Log "Deleting old template item..."
Remove-Item -Path $oldTemplate.Paths.FullPath -Recurse -Force
Start-Sleep -Milliseconds 500

$newTemplate = $masterDb.GetItem([Sitecore.Data.ID]::Parse($NewTemplateId))
$newTemplate = Ensure-SingleItem $newTemplate
if (-not ($newTemplate -is [Sitecore.Data.Items.Item])) {
    throw "Post-delete: newTemplate not a Sitecore item!"
}
$nameConflict = $false
foreach ($sibling in $newTemplate.Parent.Children) {
    if ($sibling.Name -eq $origName -and $sibling.ID -ne $newTemplate.ID) {
        $nameConflict = $true
        break
    }
}
if ($newTemplate.Name -ne $origName -and -not $nameConflict) {
    $newTemplate.Editing.BeginEdit()
    $newTemplate.Name = $origName
    $newTemplate.Editing.EndEdit()
    Write-Log "Renamed new template to: $origName"
} elseif ($nameConflict) {
    $newName = $origName + "-Renamed-" + ([guid]::NewGuid().ToString("N").Substring(0, 4))
    $newTemplate.Editing.BeginEdit()
    $newTemplate.Name = $newName
    $newTemplate.Editing.EndEdit()
    Write-Log "WARNING: Could not rename new template to $origName because a sibling with that name exists. New name: $newName"
}

Write-Log "Updating __Base templates fields referencing old template..."
$allTemplates = Get-ChildItem -Path "master:/sitecore/templates" -Recurse | Where-Object { $_.TemplateID }
foreach ($tmpl in $allTemplates) {
    $baseTemplatesField = $tmpl.Fields["__Base templates"]
    if ($baseTemplatesField -and $baseTemplatesField.Value -match $OldTemplateId) {
        $newValue = $baseTemplatesField.Value.Replace($OldTemplateId, $NewTemplateId)
        try {
            $tmpl.Editing.BeginEdit()
            $baseTemplatesField.Value = $newValue
            $tmpl.Editing.EndEdit()
            Write-Log "Updated __Base templates for: $($tmpl.Paths.FullPath)"
        } catch {
            if ($tmpl.Editing -ne $null) { $tmpl.Editing.CancelEdit() }
            Write-Log "Failed to update __Base templates for: $($tmpl.Paths.FullPath)"
        }
    }
}

Write-Log "Updating Insert Options, Droptree/Template Picker field sources, etc..."
$allItems = Get-ChildItem -Path "master:" -Recurse | Where-Object { $_.Fields.Count -gt 0 }
foreach ($item in $allItems) {
    $changed = $false
    foreach ($field in $item.Fields) {
        if ($field.Value -and $field.Value -like "*$OldTemplateId*") {
            $newValue = $field.Value.Replace($OldTemplateId, $NewTemplateId)
            if ($newValue -ne $field.Value) {
                try {
                    $item.Editing.BeginEdit()
                    $field.Value = $newValue
                    $item.Editing.EndEdit()
                    $changed = $true
                } catch {
                    if ($item.Editing -ne $null) { $item.Editing.CancelEdit() }
                }
            }
        }
    }
    if ($changed) { Write-Log "Updated field references in: $($item.Paths.FullPath)" }
}

Write-Log "Updating branch templates referencing old template..."
$branchRoot = $masterDb.GetItem("/sitecore/branches")
if ($branchRoot) {
    $branchItems = Get-ChildItem -Path "master:/sitecore/branches" -Recurse
    foreach ($branch in $branchItems) {
        foreach ($field in $branch.Fields) {
            if ($field.Value -and $field.Value -like "*$OldTemplateId*") {
                $newValue = $field.Value.Replace($OldTemplateId, $NewTemplateId)
                if ($newValue -ne $field.Value) {
                    try {
                        $branch.Editing.BeginEdit()
                        $field.Value = $newValue
                        $branch.Editing.EndEdit()
                        Write-Log "Updated branch: $($branch.Paths.FullPath)"
                    } catch {
                        if ($branch.Editing -ne $null) { $branch.Editing.CancelEdit() }
                        Write-Log "Failed to update branch: $($branch.Paths.FullPath)"
                    }
                }
            }
        }
    }
}

if ($RebuildLinkDb) {
    Write-Log "Rebuilding LinkDatabase..."
    $linkDb = [Sitecore.Globals]::LinkDatabase
    $linkDb.Rebuild($masterDb)
}

Write-Log "Re-indexing new template and all updated items in Solr..."
try {
    $indexName = "sitecore_master_index"
    $index = [Sitecore.ContentSearch.ContentSearchManager]::GetIndex($indexName)
    $index.Refresh($newTemplate.ID)
    foreach ($item in $allContentItems) { $index.Refresh($item.ID) }
} catch { Write-Log "Index refresh failed (non-fatal): $_" }

Write-Log "TEMPLATE MIGRATION COMPLETE: All references updated, template cloned and renamed, children patched, old template removed, caches/indexes rebuilt."
</content></field><field tfid="{F62C67B4-28B6-4A6F-91CB-DB78CF054F4E}" key="enablerule" type="Rules"><content /></field></fields></item>